// 让你找出网格中“黑白数量一样多”的最大矩形区域的面积。

/*
解题思路：
1. 枚举所有可能的子矩形（四重循环），每个子矩形用左上(i,j)和右下(ii,jj)确定。
2. 用check函数统计该子矩形内0和1的数量，判断是否平衡（数量相等）。
3. 只有格子数为偶数的子矩形才可能平衡。
4. 若平衡则更新最大面积。
5. 最终输出最大平衡子矩形的面积。

该方法直观易懂，适合数据范围较小的情况。
*/


#include <iostream>
#include <string>
using namespace std;
const int N = 55; // 支持最大50*50的网格
int w[N][N];      // 存储网格，w[i][j]=0表示白色，1表示黑色
int n, m;

// 检查子矩形(xa,ya)-(xb,yb)是否平衡
bool check(int xa, int ya, int xb, int yb) {
    int a[2] = {0, 0}; // a[0]统计白色格子数，a[1]统计黑色格子数
    for (int i = xa; i <= xb; i++) {
        for (int j = ya; j <= yb; j++) {
            a[w[i][j]]++; // 统计每种颜色的格子数
        }
    }
    return a[0] == a[1]; // 平衡：黑白数量相等
}

// 不用嵌套动态数组，全部用一维静态数组实现
int main() {
    cin >> n >> m;
    // 读入网格数据
    for (int i = 1; i <= n; i++) {
        string s;
        cin >> s;
        for (int j = 1; j <= m; j++) {
            w[i][j] = s[j - 1] - '0'; // '0'->0(白)，'1'->1(黑)
        }
    }
    int ans = 0; // 记录最大平衡子矩形面积
    // 枚举所有可能的子矩形
    for (int i = 1; i <= n; i++) {         // 上边界
        for (int j = 1; j <= m; j++) {     // 左边界
            for (int ii = i; ii <= n; ii++) {   // 下边界
                for (int jj = j; jj <= m; jj++) { // 右边界
                    int area = (ii - i + 1) * (jj - j + 1); // 当前子矩形面积
                    if (area % 2 == 0) { // 只有偶数格子才可能平衡
                        if (check(i, j, ii, jj)) { // 判断是否平衡
                            ans = max(ans, area); // 更新最大面积
                        }
                    }
                }
            }
        }
    }
    cout << ans << "\n"; // 输出最大平衡子矩形面积
    return 0;
}

